package speelotheek.models;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import speelotheek.components.Database;
import speelotheek.components.JSqlList;

public class Lid {

	private DateFormat mysqlDateFormat = new SimpleDateFormat("yyyy-MM-dd");
	private Date todayDate = new Date();
	
	private int nummer;
	private String naam;
	private String adres;
	private String postcode;
	private String woonplaats;
	private String email;
	private String telefoon;
	private Date startlidmaatschap;
	private Date eindlidmaatschap;
	
	/**
	 * @return the nummer
	 */
	public int getNummer() {
		return nummer;
	}
	
	/**
	 * @param nummer the nummer to set
	 */
	public void setNummer(int nummer) {
		this.nummer = nummer;
	}
	
	/**
	 * @return the naam
	 */
	public String getNaam() {
		return naam;
	}
	
	/**
	 * @param naam the naam to set
	 */
	public void setNaam(String naam) {
		this.naam = naam;
	}
	
	/**
	 * @return the adres
	 */
	public String getAdres() {
		return adres;
	}
	
	/**
	 * @param adres the adres to set
	 */
	public void setAdres(String adres) {
		this.adres = adres;
	}
	
	/**
	 * @return the postcode
	 */
	public String getPostcode() {
		return postcode;
	}
	
	/**
	 * @param postcode the postcode to set
	 */
	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}
	
	/**
	 * @return the woonplaats
	 */
	public String getWoonplaats() {
		return woonplaats;
	}
	
	/**
	 * @param woonplaats the woonplaats to set
	 */
	public void setWoonplaats(String woonplaats) {
		this.woonplaats = woonplaats;
	}
	
	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}
	
	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}
	
	/**
	 * @return the telefoon
	 */
	public String getTelefoon() {
		return telefoon;
	}
	
	/**
	 * @param telefoon the telefoon to set
	 */
	public void setTelefoon(String telefoon) {
		this.telefoon = telefoon;
	}
	
	/**
	 * @return the startlidmaatschap
	 */
	public Date getStartlidmaatschap() {
		return startlidmaatschap;
	}
	
	/**
	 * @param startlidmaatschap the startlidmaatschap to set
	 */
	public void setStartlidmaatschap(Date startlidmaatschap) {
		this.startlidmaatschap = startlidmaatschap;
	}
	
	/**
	 * @return the eindlidmaatschap
	 */
	public Date getEindlidmaatschap() {
		return eindlidmaatschap;
	}
	
	public Boolean IsActive() {
		boolean isActive = false;
		if (startlidmaatschap != null)
		{
			isActive = startlidmaatschap.compareTo(todayDate) <= 0;
		
			if (eindlidmaatschap != null)
			{
				isActive = eindlidmaatschap.compareTo(todayDate) >= 0;
			}
		}
		
		return
				isActive;
	}
	
	public int getTotalUitleningenToday() {
		
		String query = "select count(*) from uitlening where lid = " + nummer + " AND uitleendatum = " + mysqlDateFormat.format(todayDate);
		String result = Database.executeOneColumnSelectQuery(query);
		
		return (result != null ? Integer.parseInt(result) : 0);
	}
	
	public int getTotalUitleningen() {
		String query = "select count(*) from uitlening where lid = " + nummer;
		String result = Database.executeOneColumnSelectQuery(query);
		
		return (result != null ? Integer.parseInt(result) : 0);
	}
	
	/**
	 * @param eindlidmaatschap the eindlidmaatschap to set
	 */
	public void setEindlidmaatschap(Date eindlidmaatschap) {
		this.eindlidmaatschap = eindlidmaatschap;
	}
	
	  //haal Lid op uit de database op basis van zijn nummer
	  public static Lid getLid(int nummer) {
	    String query = "select nummer, naam, adres, postcode, woonplaats, email, telefoon, startlidmaatschap, eindlidmaatschap from lid where nummer = " + nummer;
	    //het echte werk wordt in getLeden gedaan
	    Lid[] ds = Lid.getLeden(query);
	    if (ds == null) {
	      return null;
	    }
	    //we selecteren de eerste speelgoed uit het opgeleverde array
	    return ds[0];
	  }
	  
	  // hulpmethod om leden te zoeken mbv zijn naam of code
	  public static Lid[] getAllNaamOrNummer(String keyword) {
	    String query = "select nummer, naam, adres, postcode, woonplaats, email, telefoon, startlidmaatschap, eindlidmaatschap from lid where naam like '%" + keyword + "%' OR nummer like '%" + keyword + "%'";
	    return getLeden(query);
	  }

	  private static Lid[] getLeden(String query) {
	    //voer query uit op de database  
	    ResultSet r = Database.executeSelectQuery(query);
	    //sla straks de ledengegevens op in een arraylist
	    ArrayList<Lid> lid = new ArrayList<Lid>();
	    // haal de gegevens nu per lid op en stop ze in een lid object
	    try {
	      while (r.next()) {
	        Lid value = new Lid();
	        
	        value.setNummer(r.getInt("nummer"));
	        value.setNaam(r.getString("naam"));
	        value.setAdres(r.getString("adres"));
	        value.setPostcode(r.getString("postcode"));
	        value.setWoonplaats(r.getString("woonplaats"));
	        value.setEmail(r.getString("email"));
	        value.setTelefoon(r.getString("telefoon"));
	        value.setStartlidmaatschap(r.getDate("startlidmaatschap"));
	        value.setEindlidmaatschap(r.getDate("eindlidmaatschap"));

	        //nu gaan de gegevens naar de arraylist
	        lid.add(value);
	      }
	    } catch (SQLException e) {
	      System.out.println("lid: getLid: " + e.toString());
	      System.out.println(e.getMessage() + "\n" + e.getSQLState() + "\n" + e.getErrorCode());
	    }
	    if(lid.size() == 0)
	      System.out.println("Lid: getLid: " + "geen leden uit deze query " + query);
	      
	    //nu je weet hoeveel leden er gevonden zijn kun je ze in een array stoppen
	    Lid[] array = new Lid[lid.size()];
	    for(int i = 0; i<lid.size() ; i++)
	      array[i] = lid.get(i);
	    return array;
	  }
	  
	  @Override
	  //print de ledengegevens als tabel
	  public String toString() {
	    String output = "";
	    output += JSqlList.setSpaces(getNummer() + "", 5);
	    output += JSqlList.setSpaces(getNaam(), 20);
	    return output;
	  }
	  
	  public void addCustomer() throws Exception 
	  {
		  String query = "INSERT INTO lid " +
				  		 "(naam, adres, postcode, woonplaats, email, telefoon, startlidmaatschap, eindlidmaatschap)" +
		  				 "VALUES ('"+this.naam+"', '" +
				                   this.adres+"', '" +
		  				           this.postcode+"', '" +
				                   this.woonplaats+"', '" +
		  				           this.email+"', '" +
				                   this.telefoon+"', '" +
		  				           this.startlidmaatschap+"', '" +
				                   this.eindlidmaatschap+"');";
		  
		  int result = Database.executeInsertQuery(query);
		  
		  if( result == -1 || result == 0) {
			  throw new Exception("Insert failed, result: "+result);
		  }
	  }
	  
	  public void updateCustomer() throws Exception 
	  {
		  String query = "UPDATE lid " +
				  		 "SET naam='"+this.naam+"', " +
				  		 	 "adres='"+this.adres+"', " +
				  		 	 "postcode='"+this.postcode+"', " +
				  		 	 "woonplaats='"+this.woonplaats+"', " +
				  		 	 "email='"+this.email+"', " +
				  		 	 "telefoon='"+this.telefoon+"', " +
				  		 	 "eindlidmaatschap='"+this.eindlidmaatschap+"' " +
				  		 "WHERE nummer="+this.nummer+";";
		  
		  int result = Database.executeUpdateQuery(query);
		  
		  if( result == -1 || result == 0) {
			  throw new Exception("Update failed, result: "+result);
		  }
	  }
	  
	  public static boolean removeCustomer(String nummer)
	  {
		  boolean success = false;
		  
		  String query = "DELETE FROM lid WHERE nummer = '"+nummer+"'";
		  
		  switch(Database.executeDeleteQuery(query)){
		  	case -1:
		  		success = false;
		  		break;
		  	case 0:
		  	case 1:
		  		success = true;
		  		break;
		  }
		  
		  return success;
	  }
		
	  public int getLatestId() throws Exception 
	  {
		  String query = "SELECT LAST_INSERT_ID()";
		  ResultSet result = Database.executeSelectQuery(query);
		  int id = -1;
		  if(result.next()) {
			  id = ((Number) result.getObject(1)).intValue();
		  }
		  return id;
	  }
}
